/*
    Copyright (C) 2013 maik.jablonski@jease.org

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package jfix.zk;

import java.util.ArrayList;
import java.util.List;

import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.SimpleListModel;
import org.zkoss.zul.ext.Selectable;

public class Listbox extends org.zkoss.zul.Listbox {

	public Listbox() {
		setSeltype("single");
	}

	public Listbox(List values) {
		setValues(values);
	}

	public Listbox(Object[] values) {
		setValues(values);
	}

	public Listbox doPaged(int pageSize) {
		setMold("paging");
		setPageSize(pageSize);
		return this;
	}

	public void setValues(Object[] values) {
		if (values != null) {
			setModel(new SimpleListModel(values));
		}
	}

	public void setValues(List values) {
		if (values != null) {
			setModel(new SimpleListModel(values));
		}
	}

	public void setModel(ListModel model) {
		super.setModel(model);
	}

	public void setSelection(List values, Object selected) {
		setValues(values);
		setSelectedValue(selected);
	}

	public void setModel(Object[] values, Object selected) {
		setValues(values);
		setSelectedValue(selected);
	}

	public Object getSelectedValue() {
		if (getSelectedIndex() != -1) {
			return getModel().getElementAt(getSelectedIndex());
		}
		return null;
	}

	public Object[] getValues() {
		List values = new ArrayList();
		for (int i = 0; i < getItemCount(); i++) {
			Object value = getItemAtIndex(i).getValue();
			if (value != null) {
				values.add(getItemAtIndex(i).getValue());
			}
		}
		return values.toArray(new Object[] {});
	}

	public void setSelectedValue(Object value) {
		setSelectedIndex(-1);
		if (value != null) {
			for (int i = 0; i < getModel().getSize(); i++) {
				if (value.equals(getModel().getElementAt(i))) {
					setSelectedIndex(i);
					return;
				}
			}
		}
	}

	public void addSelectListener(final ActionListener actionListener) {
		addEventListener(Events.ON_SELECT, new EventListener() {
			public void onEvent(Event e) throws Exception {
				actionListener.actionPerformed(e);
			}
		});
	}

	public void addDropListener(final ActionListener actionListener) {
		addEventListener(Events.ON_DROP, new EventListener() {
			public void onEvent(Event e) throws Exception {
				actionListener.actionPerformed(e);
			}
		});
	}

	public boolean isEmpty() {
		return getSelectedValue() == null;
	}

	public void clearSelection() {
		super.clearSelection();
		((Selectable) getModel()).clearSelection();
	}

}
